import { CString, FFIType, JSCallback } from "bun:ffi";
import { toCStr, lib } from "./ffi";
import { ConfigFlags, type Image } from "./utils"

export const Core = {
    /**
     * 初始化窗口
     * @param width 窗口宽度
     * @param height 窗口高度
     * @param title 窗口标题
     * @returns void
     */
    initWindow: function (width: number, height: number, title: string): void {
        lib.symbols.InitWindow(width, height, toCStr(title))
    },
    /**
     * 关闭窗口
     * @returns void
     */
    closeWindow: function (): void {
        lib.symbols.CloseWindow()
    },
    /**
     * 检查应用是否关闭
     * @returns boolean 是否关闭
     */
    windowShouldClose: function (): boolean {
        return lib.symbols.WindowShouldClose()
    },
    /**
     * 检查窗口是否准备就绪
     * @returns boolean 是否准备就绪
     */
    isWindowReady: function (): boolean {
        return lib.symbols.IsWindowReady()
    },
    /**
     * 检查窗口是否全屏
     * @returns boolean 是否全屏
     */
    isWindowFullscreen: function (): boolean {
        return lib.symbols.IsWindowFullscreen()
    },
    /**
     * 检查窗口当前是否隐藏
     * @returns boolean 是否隐藏
     */
    isWindowHidden: function (): boolean {
        return lib.symbols.IsWindowHidden()
    },
    /**
     * 检查窗口当前是否最小化
     * @returns boolean 是否最小化
     */
    isWindowMinimized: function (): boolean {
        return lib.symbols.IsWindowMinimized()
    },
    /**
     * 检查窗口当前是否最大化
     * @returns boolean 是否最大化
     */
    isWindowMaximized: function (): boolean {
        return lib.symbols.IsWindowMaximized()
    },
    /**
     * 检查窗口当前是否获得焦点
     * @returns boolean 是否获得焦点
     */
    isWindowFocused: function (): boolean {
        return lib.symbols.IsWindowFocused()
    },
    /**
     * 检查窗口是否被调整大小
     * @returns boolean 是否被调整大小
     */
    isWindowResized: function (): boolean {
        return lib.symbols.IsWindowResized()
    },
    /**
     * 检查窗口是否处于指定状态
     * @param state 状态
     * @returns boolean 是否处于指定状态
     */
    isWindowState: function (state: ConfigFlags): boolean {
        return lib.symbols.IsWindowState(state)
    },
    /**
     * 使用标志设置窗口配置状态
     * @param state 状态
     * @returns void
     */
    setWindowState: function (state: ConfigFlags): void {
        lib.symbols.SetWindowState(state)
    },
    /**
     * 清除窗口配置状态标志
     * @param state 状态
     * @returns void
     */
    clearWindowState: function (state: ConfigFlags): void {
        lib.symbols.ClearWindowState(state)
    },
    /**
     * 切换全屏/窗口化模式
     * @returns void
     */
    toggleFullscreen: function (): void {
        lib.symbols.ToggleFullscreen()
    },
    /**
     * 切换无边框窗口模式
     * @returns void
     */
    toggleBorderlessWindowed: function (): void {
        lib.symbols.ToggleBorderlessWindowed()
    },
    /**
     * 最大化窗口（如果可调整大小）
     * @returns void
     */
    maximizeWindow: function (): void {
        lib.symbols.MaximizeWindow()
    },
    /**
     * 最小化窗口（如果可调整大小）
     * @returns void
     */
    minimizeWindow: function (): void {
        lib.symbols.MinimizeWindow()
    },
    /**
     * 恢复窗口（取消最小化/最大化状态）
     * @returns void
     */
    restoreWindow: function (): void {
        lib.symbols.RestoreWindow()
    },
    /**
     * 设置窗口图标（单张RGBA 32位图像）
     * @param icon 图标
     * @returns void
     */
    setWindowIcon: function (icon: Image): void {
        lib.symbols.SetWindowIcon(icon.ptr)
    },

    /**
     * 开始绘制
     * @returns void
     */
    beginDrawing: function (): void {
        lib.symbols.BeginDrawing()
    },
    /**
     * 结束绘制
     * @returns void
     */
    endDrawing: function (): void {
        lib.symbols.EndDrawing()
    }
}